<?php

	/**
	 * File : files.php
	 * Description : Accès et gestion des fichiers via SSH
	 * Date : 07.08.2012 14:12:12
	 * 
	 * This file is part of Phenix.  Phenix is free software: you can
	 * redistribute it and/or modify it under the terms of the GNU General Public
	 * License as published by the Free Software Foundation, version 2.
	 *
	 * This program is distributed in the hope that it will be useful, but WITHOUT
	 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
	 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
	 * details.
	 *
	 * You should have received a copy of the GNU General Public License along with
	 * this program; if not, write to the Free Software Foundation, Inc., 51
	 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
	 *
	 * Nils Schaetti <n.schaetti@gmail.com>
	**/

	/***************************
	 * Fonctions pour travailler
	 * avec les fichiers du serveur
	 * distant.
	****************************/

	// Répertoire courant
	function lp_pwd($con)
	{
		return(lp_execute($con,'pwd'));
	}

	// Change de répertoire courant
	function lp_cd($con,$dir)
	{
		// Envoie la commande
		$result=lp_execute($con,"cd ..");
		return($result);
	}

	// Récupère la liste des fichier du répertoire courant
	function lp_ls($con,$dir,$showHiddenFiles,$args)
	{
		// Commande ls -l
		if($showHiddenFiles)
			$ls_dir=lp_execute($con,"ls -la$args $dir 2>&1");
		else
			$ls_dir=lp_execute($con,"ls -l$args $dir 2>&1");
		
		// Flux vide -> erreur
		if($ls_dir === '')
			return false;
			
		// Met le tout dans un tableau par lignes
		$files_lines=split("\n",$ls_dir);
		
		// Pas d'en-tête quand un seul fichier
		if(count($files_lines) > 2)
		{
			// Enlève l'en tête et la dernière ligne
			$files_lines=array_slice($files_lines,1,count($files_lines)-2);
		}
		else
			$files_lines=array_slice($files_lines,0,1);
			
		// Pour chaque fichier
		foreach($files_lines as $file)
		{
			// Nouveau tableau contenant les propriétés du fichier courant
			$tmp_infos = split(' ',$file);
			
			// Enlève les éléments vide
			$tmp_infos = lp_remove_empty_elements($tmp_infos);
			
			// Supprime les entrées vide
			$count = 0;
			for($i=0;$i<count($tmp_infos);$i++)
			{
				if($tmp_infos[$i] !== '')
				{
					$file_infos[$count++] = $tmp_infos[$i];
				}
			}
			
			// Lien symbolique
			if($file_infos[0][0] === 'l')
			{
				// Type lien
				$file_type = IS_LINK;
				// Ajoute chaque mot suivant, jusqu'à =>
				
				for($i=9; $file_infos[$i] != '->'; $i++)
					$file_infos[8] .= ' '.$file_infos[$i];
					
				// Garde que le necessaire
				$file_infos = array_slice($file_infos,0,9);
			}
			else
			{
				// Nom composé
				if(count($file_infos) > 9)
				{
					// Ajoute chaque mot suivant
					for($i=9;$i<count($file_infos);$i++)
						$file_infos[8] .= ' '.$file_infos[$i];
					// Garde que le necessaire
					$file_infos = array_slice($file_infos,0,9);
				}
				// Quel type de fichier
				if($file_infos[0][0] === 'd')
					$file_type = IS_DIR;
				else
					$file_type = IS_FILE;
			}
			// Nouvel objet fichier
			$files[] = new SshFile($file_infos[8],$file_infos[0],$file_infos[2],$file_type,$file_infos[5].' '.$file_infos[6].' '.$file_infos[7], $file_infos[4]);
		}
		if(isset($files))
			return($files);
		else
			return('');
	}

	/*
	 * Enlève les éléments vides d'un tableau
	*/
	function lp_remove_empty_elements($tab)
	{
		$result = array();

		// Pour chaque élément du tableau d'origine
		foreach($tab as $element)
			if($element !== '')
				$result[] = $element;
		return $result;
	}
	
	/**
	 * Crée un répertoire
	 * 
	 * @param object $ssh_handler Connexion SSH
	 * @param string $dir Répertoire à créer
	 */
	function lp_mkdir($ssh_handler, $dir)
	{
		// Execute mkdir
		$result = lp_execute($ssh_handler, "mkdir $dir 2>&1");

		// Si contient 'Permission denied'
		if($result === '')
			return true;
		else
			return false;
	}
	
	/**
	 * Supprime un fichier ou un répertoire
	 * 
	 * @param object $ssh_handler Connexion SSH
	 * @param string $file Fichier ou répertoire à supprimer
	 */
	function lp_rm($ssh_handler, $file)
	{
		// Execute mkdir
		$result = lp_execute($ssh_handler, "rm -R $file 2>&1");

		// Si contient 'Permission denied'
		if($result === '')
			return true;
		else
			return false;
	}
	
	/**
	 * Bouge un fichier
	 *
	 * @param string $ssh_handler Connexion SSH
	 * @param string $source Fichier à bouger
	 * @param string $destination Fichier destination
	 */
	function lp_mv($ssh_handler, $source, $destination)
	{
		// Execute mv
		$result = lp_execute($ssh_handler, "mv $source $destination");
		
		// Si erreur
		if($result === '')
			return true;
		else
			return false;
	}

	/********************************
	 * Classe représentant un fichier
	 * sur serveur distant
	 ******************************/
	
	define('IS_FILE','0');
	define('IS_DIR','1');
	define('IS_LINK','2');

	class SshFile
	{

		// Nom du fichier
		public $filename;

		// Droits
		public $rights;

		// Propriétaires
		public $owner;

		// Type de fichier
		public $type;
		
		// Dernière modification
		public $lastModification;
		
		// Taille
		public $size;

		// Constructeur
		public function __construct ($filename,$rights,$owner,$type,$lastModification = '', $size = 0)
		{
			$this->filename = $filename;
			$this->rights = $rights;
			$this->owner = $owner;
			$this->type = $type;
			$this->lastModification = $lastModification;
			$this->size = $size;
		}

		// Nom de fichier
		public function getFilename() { return($this->filename); }

		// Droits
		public function getRights() { return($this->rights); }

		// Propriétaire
		public function getOwner() { return($this->owner); }
		
		// Dernière modification
		public function getLastModification() { return($this->lastModification); }
		
		// Taille
		public function getSize() { return($this->size); }

		// Affiche les informations
		public function show()
		{
			echo 'Filename: '.$this->filename.' ';
			echo 'Rights: '.$this->rights.' ';
			echo 'Owner: '.$this->owner.'<br>';
		}

		// Le fichier est un répertoire
		public function is_dir()
		{
			if($this->type == IS_DIR)
				return true;
			else
				return false;
		}
		
		// L'extention du fichier
		public function ext()
		{
			// Dernière position du point
			$pos = strrpos($this->filename, ".");
			
			// Extentsion
			return substr($this->filename, $pos+1);
		}

	}

?>
